import {Native} from "./native.js"

/**
 * 百度语音识别接口。
 * @static
 * @class
 * @version 1
 * @author GuoHua Liu
 * @copyright Copyright © 2019 GuoHua Liu. All rights reserved.
 */
class bdAsr {


    /**
     * @private
     * @param {string} name
     * @param {function} onevent
     * @param {*} context
     */
    static addObserver(name, onevent, context) {
        Native.getInstance().addObserver("bdAsr/" + name, onevent, context)
        return this;
    }

    /**
     * @private
     * @param {string} name
     * @param {function} onevent
     */
    static removeObserver(name, onevent) {
        Native.getInstance().delObserver("bdAsr/" + name, onevent)
        return this;
    }

    /**
     * @callback BdAsrExitObserver
     * @param {{name:string}} event
     */

    /**
     * 添加观察者：监听语音识别退出
     * @since 2
     * @param {BdAsrExitObserver} onevent
     * @param {*} context
     */
    static addExitObserver(onevent, context=null) {
        this.addObserver("exit", onevent, context)
        return this;
    }

    /**
     * 删除addExitObserver注册的观察者
     * @since 2
     * @param {BdAsrExitObserver} [onevent=null] onevent
     * @default
     */
    static removeExitObserver(onevent = null) {
        this.removeObserver("exit", onevent)
        return this;
    }


    /**
     * @callback BdAsrResultsObserver
     * @param {{name:string,data:{results:Array<string>,result_type:string}}} event result_type的可能值：
     * - "final" 最终结果,当收到该结果的时候,说明失败完成
     * - "partial" 中间结果
     */

    /**
     * 添加观察者：监听语音识别结果.可能会被多次调用,以最后一次调用的结果为最好的结果(event.data.result_type="final")
     * @since 2
     * @param {BdAsrResultsObserver} onevent
     * @param {*} [context=null] context
     */
    static addResultsObserver(onevent, context=null) {
        this.addObserver("results", onevent, context)
        return this;
    }

    /**
     * 删除addResultsObserver注册的观察者
     * @since 2
     * @param {BdAsrResultsObserver} [onevent = null] onevent
     */
    static removeResultsObserver(onevent = null) {
        this.removeObserver("results", onevent)
        return this;
    }

    /**
     * @callback BdAsrErrorObserver
     * @param {{name:string,data:{errCode:number,errMsg:string}}} event
     */

    /**
     * 添加观察者：监听识别错误
     * @since 2
     * @param {BdAsrErrorObserver} onevent
     * @param {*} [context=null] context
     */
    static addErrorObserver(onevent, context=null) {
        this.addObserver("error", onevent, context)
        return this;
    }

    /**
     * 删除addErrorObserver注册的观察者
     * @since 2
     * @param {BdAsrErrorObserver} [onevent = null] onevent
     */
    static removeErrorObserver(onevent = null) {
        this.removeObserver("error", onevent)
        return this;
    }


    /**
     * 在start之前，需要先获得用户授权
     * @requires {Promise} 错误码:
     * - -1 环境不支持
     * - 其他 未知错误
     */
    static requestAuthorization() {
        return new Promise((resolve,reject)=>{
            Native.getInstance().callNative("bdAsr", {method:"requestAuthorization"}, true, resolve, reject);
        })
    }

    /**
     * 开始语音识别
     * @returns {Promise}
     * 成功回调：{}
     * 失败回调：{errCode,errMsg}
     * 错误码列表：
     * - -1 环境不支持
     * - 其他 未知错误
     */
    static start() {
        return new Promise((resolve,reject)=>{
            Native.getInstance().callNative("bdAsr", {method:"start"}, true, resolve, reject);
        })
    }

    /**
     * 手动停止语音识别。
     */
    static stop() {
        Native.getInstance().callNative("bdAsr", {method: "stop"}, false);
    }

}

export {bdAsr}

